package cn.appsys.logger;

import org.apache.catalina.tribes.util.Arrays;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Before;

/**
 * 日志增强类，实现对业务层中所有方法添加日志增强处理
 * @author Administrator
 *
 */
public class AppSysServiceLogger {
private static final Logger log = Logger.getLogger("ErrorLogger.class");
	
	//@Pointcut("execution(* service.impl.*.*(..))")
	//public void pointcut(){}//切入点签名的方法的返回值必须为 void
	
	
	//代表前置增强的方法
	//@Before("execution(* service.impl.*.*(..))")
	//@Before("pointcut()")
	public void before(JoinPoint jp){
		// jp是连接点对象(即要切入的那个方法对象)，通过jp可以得到这个方法的所在的类名，方法名，入参
		log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法入参："+Arrays.toString(jp.getArgs()));
	}
	
	
	//代表后置增强的方法
	//@AfterReturning(pointcut="execution(* service.impl.*.*(..))",returning="result")
	//@AfterReturning(pointcut="pointcut()",returning="result")
	public void afterReturning(JoinPoint jp,Object result){
		log.info("调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法返回值："+result);
	}
	
	
	//代表异常抛出增强
	//@AfterThrowing(pointcut="pointcut()",throwing="e")
	public void afterThrowing(JoinPoint jp,Exception e){
		log.error(jp.getSignature().getName()+"方法发生异常："+e);
	}
	
	
	//代表最终异常
	//@After("pointcut()")
	public void afterLogger(JoinPoint jp){
		log.info("调用了" + jp.getTarget() + "类中的"
				+ jp.getSignature().getName() + "方法，方法已执行完毕！");
	}
}
